import time

def print_with_delay(text, delay=0.03):
    """带延迟打印，模拟打字效果"""
    for char in text:
        print(char, end='', flush=True)
        time.sleep(delay)
    print()

def validate_input(prompt, min_val=1):
    """输入校验：确保输入是大于等于min_val的整数"""
    while True:
        user_input = input(prompt)
        try:
            num = int(user_input)
            if num >= min_val:
                return num
            else:
                print(f"❌ 请输入大于等于{min_val}的整数！")
        except ValueError:
            print("❌ 输入无效！请输入一个整数。")

def clap_on_seven_advanced():
    """升级版本逢七拍手游戏"""
    # 欢迎界面
    print("\n" + "="*50)
    print_with_delay("🎉 欢迎来到升级版本 - 逢七拍手游戏 🎉")
    print("="*50 + "\n")

    # 自定义范围
    default_max = 100
    max_num = validate_input(
        f"请输入计数上限（默认{default_max}，直接回车使用默认值）：",
        min_val=7  # 至少要到7才会有拍手数字
    ) if input(f"请输入计数上限（默认{default_max}，直接回车使用默认值）：").strip() else default_max

    # 初始化分类存储
    multiple_of_seven = []  # 7的倍数
    contains_seven = []     # 包含数字7（非倍数）
    both_conditions = []    # 既是倍数又包含7

    print(f"\n🔍 正在计算1~{max_num}中需要拍手的数字...")
    time.sleep(1)  # 模拟计算延迟，提升体验

    # 遍历判断
    for num in range(1, max_num + 1):
        is_multiple = num % 7 == 0
        has_seven = '7' in str(num)
        
        if is_multiple and has_seven:
            both_conditions.append(num)
        elif is_multiple:
            multiple_of_seven.append(num)
        elif has_seven:
            contains_seven.append(num)

    # 汇总所有拍手数字
    all_clap = multiple_of_seven + contains_seven + both_conditions
    all_clap.sort()  # 排序

    # 输出结果（美化格式）
    print("\n" + "-"*60)
    print_with_delay(f"📊 1~{max_num} 逢七拍手游戏结果汇总：")
    print("-"*60)
    print(f"总共有 {len(all_clap)} 个数字需要拍手！\n")

    # 分类型显示（带颜色标记，终端支持ANSI颜色）
    if both_conditions:
        print(f"🔴 既是7的倍数又包含7：{' '.join(map(str, both_conditions))}")
        print(f"   （共{len(both_conditions)}个）")
    if multiple_of_seven:
        print(f"🟡 是7的倍数但不包含7：{' '.join(map(str, multiple_of_seven))}")
        print(f"   （共{len(multiple_of_seven)}个）")
    if contains_seven:
        print(f"🟢 包含7但不是7的倍数：{' '.join(map(str, contains_seven))}")
        print(f"   （共{len(contains_seven)}个）")

    # 完整列表（按顺序）
    print(f"\n📜 按顺序排列的所有拍手数字：")
    # 每10个数字换行，便于查看
    for i in range(0, len(all_clap), 10):
        print(f"   {' '.join(map(str, all_clap[i:i+10]))}")

    print("\n" + "-"*60)

def main():
    """主程序：支持重复游戏"""
    while True:
        clap_on_seven_advanced()
        
        # 询问是否继续
        play_again = input("\n🔄 是否要再玩一次？（y/n，默认n）：").strip().lower()
        if play_again != 'y':
            print_with_delay("\n👋 感谢游玩！下次再见～")
            break
        print("\n" + "="*50 + "\n")

if __name__ == "__main__":
    main()